package com.cqhilink.iot.jobstandardmanagement.facade.service.department;

import com.cqhilink.iot.jobstandardmanagement.facade.model.*;

import java.util.List;
import java.util.Map;

/**
 * @version V1.0
 * @Package com.cqhilink.iot.jobstandardmanagement.services.innerservice.department
 * @Description: ${TODO}(组织部门服务层)
 * @author: YuPeng
 * @date: 2016/11/28,9:19
 */
public interface JsmDepartmentService {

    /**
     * 加载所有组织部门树
     */
    public List<Ztree> selectAllDept() throws Exception;

    /**
     * @param orgId 组织机构id
     */
    public List<Ztree> queryDeptByOrgId(String orgId) throws Exception;

    /**
     * 查询部门树
     *
     * @return
     * @throws Exception
     */
    List<Ztree> queryDeptTree(String isOrg, String id, String keyword) throws Exception;

    /**
     * 根据ID查询
     *
     * @param deptId
     * @return
     */
    Department selectById(String deptId);

    /**
     * 查询所有的组织部门树
     */
    List<Ztree> loadDeptTree() throws Exception;

    /**
     * 获取包含上级的组织部门树
     * 适用于pid不为空的情况
     *
     * @param isOrg
     * @param pid
     * @return
     * @throws Exception
     */
    List<Ztree> queryDeptTreeWithParent(String isOrg, String pid) throws Exception;

    /**
     * 按部门ID查询部门子节点
     *
     * @param deptId
     * @return
     * @throws Exception
     */
    List<Ztree> queryDeptTreeByPDId(String deptId) throws Exception;

    /**
     * 按组织机构ID查询部门子节点
     *
     * @param orgId
     * @return
     * @throws Exception
     */
    List<Ztree> queryDeptTreeByPOId(String orgId, int isNum) throws Exception;

    /**
     * 查询部门详情
     *
     * @param deptId
     * @return
     * @throws Exception
     */
    DepartmentVO findDeptById(String deptId) throws Exception;

    /**
     * 获取部门或机构上级管理机构
     *
     * @param deptId
     * @return
     * @throws Exception
     */
    public Organization getParentOrg(String deptId) throws Exception;

    /**
     * 新增部门
     *
     * @param dept
     * @return
     * @throws Exception
     */
    Map<String, Object> addDept(Department dept, Employee employee) throws Exception;

    /**
     * 删除部门
     *
     * @param deptId
     * @return
     * @throws Exception
     */
    Map<String, Object> delDept(String deptId) throws Exception;

    /**
     * 修改组织
     *
     * @param dept
     * @return
     * @throws Exception
     */
    Map<String, Object> updateDept(Department dept, Employee employee) throws Exception;

    /**
     * 获取部门层级枚举数组
     *
     * @param orgLevel
     * @return
     * @throws Exception
     */
    Enum[] getDeptLevel(String orgLevel);

    /**
     * AJAX核对同一组织下的部门名称是否同名
     *
     * @param depart
     * @return
     * @throws Exception
     */
    boolean checkDeptName(Department depart) throws Exception;

    /**
     * 获取当前部门下的员工
     *
     * @param deptId
     * @return
     * @throws Exception
     */
    List<EmployeeSimpleVO> getEmpByDeptId(String deptId) throws Exception;

    /**
     * 根据组织机构查询；当前组织机构
     *
     * @param orgId 组织机构Id
     */
    List<Ztree> getDeptZtreeByOrgId(String orgId) throws Exception;

    /**
     * @param list
     * @Author 卢曼成
     * @Description 批量添加
     * @Date 2017/2/8 17:17
     */
    int insertList(List<Department> list);

    /**
     * @param list
     * @Author 卢曼成
     * @Description 批量修改
     * @Date 2017/2/8 17:17
     */
    int updateList(List<Department> list);

    /**
     * @param list
     * @Author 卢曼成
     * @Description 批量逻辑删除
     * @Date 2017/2/8 17:18
     */
    int deleteList(List<Department> list);

    /**
     * 根据条件查询组织部门信息
     *
     * @param orgId
     * @param keyword
     * @return List<Ztree>
     * @Author 卢曼成
     */
    List<Ztree> queryDeptZtree(String orgId, String pOrgId, String keyword, String orgLevelId);

    /**
     * 根据组织ID查询该组织下部门数量
     *
     * @param orgId
     * @return
     */
    int selectCountByPOId(String orgId);

    /**
     * @Author 卢曼成
     * @Description 去重查询上级ID
     * @Date 2017/2/8 17:18
     */
    List<String> selectByListId(List<Department> list);

    /**
     * 查询出当前登录人 ， 当当前登录人 为 作业区级别以下的则显示顶级为作业区 ，
     * 如当前登录人为作业区级以上的则查询到分公司及以上
     */
    List<Ztree> initMyDeptmentAndChildDept(Employee employee);

    /**
     * 根据组织ID查询部门集合
     *
     * @param orgId
     * @return
     */
    List<Department> selectDeptByOrgId(String orgId);

    /**
     * 根据组织ID查询部们集合
     *
     * @param orgId
     * @return
     */
    List<DepartmentVO> selectByPOId(String orgId);
}
